package org.future.persistent.id;

import java.net.InetAddress;
import java.net.UnknownHostException;

import org.future.utils.ByteUtils;

/**
 * 生成 uuid
 * @author dycc
 * @date 2009-12-30 下午03:57:56
 */
public abstract class UUIDGenerator {
    // 分隔符
    private String separator = "";
    // ip
    private static final int ip;
    // jvm
    private static final int jvm;
    // counter
    private static short counter = 0;
    
    static{
        // 初始化ip
        int temp = 0;
        try {
            temp = ByteUtils.toInt(InetAddress.getLocalHost().getAddress());
        } catch (UnknownHostException e) {

        } finally{
            ip = temp;
        }
        // 初始化jvm
        jvm = (int)System.currentTimeMillis();
    }

    /////////////////////////////////////////////////////////////
    /////////////        get set methods             ////////////
    /////////////////////////////////////////////////////////////
    /**
     * 分隔符
     */
    protected String getSeparator() {
        return separator;
    }
    /**
     * 分隔符
     * @param separator
     */
    protected void setSeparator(String separator) {
        this.separator = separator;
    }
    /**
     * ip
     * @return
     */
    protected int getIp() {
        return ip;
    }
    /**
     * jvm 初始系统时间
     * @return
     */
    protected int getJvm() {
        return jvm;
    }
    /**
     * 当前序号
     * @return
     */
    protected short getCounter() {
        synchronized(UUIDGenerator.class){
            if(counter < 0){
                counter = 0;
            }
        }
        return counter++;
    }
    /**
     * 当前时间高32位中的低16位
     * @return
     */
    protected short getHighTime(){
        return (short)(System.currentTimeMillis() >>> 32);
    }
    /**
     * 当前时间低32位
     */
    protected int getLowerTime(){
        return (int)(System.currentTimeMillis());
    }
}
